/**
  * 观察某个对象的所有属性
  * @param {Object} obj
  */
function observe(obj) {
  for(const key in obj) {
    let internalValue = obj[key]
    let funcs = []
    Object.defineProperty(obj, key, {
      get: function() {
        // 依赖收集，记录
        if(window.__fun && !funcs.includes(window.__fun)) {
          funcs.push(window.__fun)
        }
        return internalValue
      },
      set: function(val) {
        internalValue = val
        // 派发更新，运行，执行我的函数
        for(var i=0;i<funcs.length;i++) {
          funcs[i]()
        }
      }
    })
  }
}

function autorun(fn) {
  window.__fun = fn
  fn()
  window.__fun = null
}